import { IndexDatatype } from '../../Source/Cesium.js';
import { Math as CesiumMath } from '../../Source/Cesium.js';

describe('Core/IndexDatatype', function() {

    it('IndexDatatype.validate validates input', function() {
        expect(IndexDatatype.validate(IndexDatatype.UNSIGNED_SHORT)).toEqual(true);
        expect(IndexDatatype.validate('invalid')).toEqual(false);
        expect(IndexDatatype.validate(undefined)).toEqual(false);
    });

    it('IndexDatatype.createTypedArray creates array', function() {
        expect(IndexDatatype.createTypedArray(3, 3).BYTES_PER_ELEMENT).toEqual(Uint16Array.BYTES_PER_ELEMENT);
        expect(IndexDatatype.createTypedArray(CesiumMath.SIXTY_FOUR_KILOBYTES + 1, 3).BYTES_PER_ELEMENT).toEqual(Uint32Array.BYTES_PER_ELEMENT);
    });

    it('IndexDatatype.createTypedArray throws without numberOfVertices', function() {
        expect(function() {
            IndexDatatype.createTypedArray(undefined);
        }).toThrowDeveloperError();
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer creates Uint16Array', function() {
        var sourceArray = new Uint16Array(10);
        sourceArray.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var indexBuffer = IndexDatatype.createTypedArrayFromArrayBuffer(3, sourceArray.buffer, 0, 5);
        expect(indexBuffer.BYTES_PER_ELEMENT).toEqual(Uint16Array.BYTES_PER_ELEMENT);
        expect(indexBuffer.length).toEqual(5);
        expect(indexBuffer[0]).toEqual(0);
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer creates Uint16Array with offset', function() {
        var sourceArray = new Uint16Array(10);
        sourceArray.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var indexBuffer = IndexDatatype.createTypedArrayFromArrayBuffer(3, sourceArray.buffer, Uint16Array.BYTES_PER_ELEMENT * 5, 5);
        expect(indexBuffer.BYTES_PER_ELEMENT).toEqual(Uint16Array.BYTES_PER_ELEMENT);
        expect(indexBuffer.length).toEqual(5);
        expect(indexBuffer[0]).toEqual(5);
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer creates Uint32Array', function() {
        var sourceArray = new Uint32Array(10);
        sourceArray.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var indexBuffer = IndexDatatype.createTypedArrayFromArrayBuffer(CesiumMath.SIXTY_FOUR_KILOBYTES + 1, sourceArray.buffer, 0, 5);
        expect(indexBuffer.BYTES_PER_ELEMENT).toEqual(Uint32Array.BYTES_PER_ELEMENT);
        expect(indexBuffer.length).toEqual(5);
        expect(indexBuffer[0]).toEqual(0);
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer creates Uint32Array with offset', function() {
        var sourceArray = new Uint32Array(10);
        sourceArray.set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var indexBuffer = IndexDatatype.createTypedArrayFromArrayBuffer(CesiumMath.SIXTY_FOUR_KILOBYTES + 1, sourceArray.buffer, Uint32Array.BYTES_PER_ELEMENT * 5, 5);
        expect(indexBuffer.BYTES_PER_ELEMENT).toEqual(Uint32Array.BYTES_PER_ELEMENT);
        expect(indexBuffer.length).toEqual(5);
        expect(indexBuffer[0]).toEqual(5);
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer throws without numberOfVertices', function() {
        expect(function() {
            IndexDatatype.createTypedArrayFromArrayBuffer(undefined);
        }).toThrowDeveloperError();
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer throws without sourceArray', function() {
        expect(function() {
            IndexDatatype.createTypedArrayFromArrayBuffer(3, undefined);
        }).toThrowDeveloperError();
    });

    it('IndexDatatype.createTypedArrayFromArrayBuffer throws without byteOffset', function() {
        var sourceArray = new Uint16Array(5);
        expect(function() {
            IndexDatatype.createTypedArrayFromArrayBuffer(3, sourceArray.buffer, undefined);
        }).toThrowDeveloperError();
    });

    it('IndexDatatype.getSizeInBytes returns size', function() {
        expect(IndexDatatype.getSizeInBytes(IndexDatatype.UNSIGNED_BYTE)).toEqual(Uint8Array.BYTES_PER_ELEMENT);
        expect(IndexDatatype.getSizeInBytes(IndexDatatype.UNSIGNED_SHORT)).toEqual(Uint16Array.BYTES_PER_ELEMENT);
        expect(IndexDatatype.getSizeInBytes(IndexDatatype.UNSIGNED_INT)).toEqual(Uint32Array.BYTES_PER_ELEMENT);
    });

    it('IndexDatatype.getSizeInBytes throws without indexDatatype', function() {
        expect(function() {
            IndexDatatype.getSizeInBytes(undefined);
        }).toThrowDeveloperError();
    });
});
